package Jets.utils
{
	import flash.geom.Point;

	/**
	 * 数学相关方法
	 * 
	 * @author flashyiyi
	 * 
	 */
	public class MathUtil
	{
		/**
		 * 将数值限制在一个区间内
		 * 
		 * @param v	数值
		 * @param min	最大值
		 * @param max	最小值
		 * 
		 */		
		public static function limitIn(v:Number,min:Number,max:Number):Number
		{
			return v < min ? min : v > max ? max : v;
		}
		
		/**
		 * 返回的是数学意义上的atan（坐标系与Math.atan2上下颠倒）
		 * 
		 * @param dx
		 * @param dy
		 * @return 
		 * 
		 */
		public static function atan2(dx:Number, dy:Number):Number
		{
			var a:Number;
			if (dx == 0) 
				a = Math.PI / 2;
			else if (dx > 0) 
				a = Math.atan(Math.abs(dy/dx));
			else
				a = Math.PI - Math.atan(Math.abs(dy/dx));
			
			return dy >= 0 ? a : -a;
			
		}
		
		/**
		 * 求和
		 * 
		 * @param arr
		 * @return 
		 * 
		 */
		public static function sum(arr:Array):Number
		{
			var result:Number = 0.0;
			for each (var num:Number in arr)
				result += num;
			return result;
		}
		
		/**
		 * 平均值
		 *  
		 * @param arr
		 * @return 
		 * 
		 */
		public static function avg(arr:Array):Number
		{
			return sum(arr)/arr.length;
		}
		
		/**
		 * 最大值
		 * 
		 * @param arr
		 * @return 
		 * 
		 */
		public static function max(...args):Number
		{
			var result:Number = NaN;
			if(args.length==1 && args[0] is Array)
			{
				args = args[0];
			}
			for (var i:int = 0;i < args.length;i++)
			{
				if (isNaN(result) || args[i] > result)
					result = args[i];
			}
			return result;
		}
		
		/**
		 * 最小值
		 * 
		 * @param arr
		 * @return 
		 * 
		 */
		public static function min(...args):Number
		{
			var result:Number = NaN;
			if(args.length==1 && args[0] is Array)
			{
				args = args[0];
			}
			for (var i:int = 0;i < args.length;i++)
			{
				if (isNaN(result) || args[i] < result)
					result = args[i];
			}
			return result;
		}
		
		
		/**
		 * 两个角的最小差
		 *  
		 * @param r1 起点
		 * @param r1终点
		 * @return 
		 * 
		 */
		public static function shortRotation(r1:Number,r2:Number,useRadians:Boolean = true):Number
		{
			var cap:Number = useRadians ? Math.PI * 2 : 360;
			var dif:Number = (r2 - r1) % cap;
			if (dif != dif % (cap / 2)) 
			{
				dif = (dif < 0) ? dif + cap : dif - cap;
			}
			return dif;
		}
		
		/**
		 * 随机数值，随机2个整数之间的数值
		 */
		public static function randRange(min:Number,max:Number):Number
		{
			var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
			return randomNum;
		}
		
		
		public static function randPick(...args):*
		{
			var start:int = 0;
			var end:int = args.length-1;
			return args[randRange(start,end)];
		}
		
		/**
		 * 根据园的半径以及夹角算圆上的点
		 */
		public static function circlePtByAngle(radis:Number,angle:Number):Point
		{
			var pt:Point = new Point();
			pt.x = radis * Math.cos(angle);
			pt.y = radis * Math.sin(angle);
			return pt;
		}
		
		/**
		 * 度 转换为 弧度
		 * @param	value
		 * @return
		 */
		public static function DegreesToRadians(value:Number):Number
		{
			return value * Math.PI / 180;
		}
		
		/**
		 * 弧度 转换为 度
		 * @param	value
		 * @return
		 */
		public static function RadiansToDegrees(value:Number):Number
		{
			return value * 180 / Math.PI;
		}
		
		/**
		 * 对 obj进行旋转 之 des方向 即 把物体向某点方向旋转。
		 * @param	desX
		 * @param	desY
		 * @param	objX
		 * @param	objY
		 * @return
		 */
		public static function rotationTo(desX:Number, desY:Number, objX:Number, objY:Number):Number
		{
			return RadiansToDegrees(Math.atan2(desY - objY, desX - objX));
		}
		
		/**
		 * 计算点src到点des的距离 即 两点间距离
		 * @param	srcX
		 * @param	srcY
		 * @param	desX
		 * @param	desY
		 * @return
		 */
		public static function Destance(srcX:Number, srcY:Number, desX:Number, desY:Number):Number
		{
			return Math.sqrt(Math.pow(srcX - desX, 2) + Math.pow(srcY - desY, 2));
		}
	}
}